package lu.med.praxiswahl.wahlumed.client.mahnungen;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;

import lu.med.praxiswahl.wahlumed.client.laborbuch.LaborbuchDataModel;
import lu.med.praxiswahl.wahlumed.client.utilities.UniCode;
import lu.med.praxiswahl.wahlumed.client.wclient.Main;
import lu.med.praxiswahl.wahlumed.model.beans.RemindersTBL;

public class MahnungenTableModel extends AbstractTableModel
{
    /**
     * 
     */
    private static final long serialVersionUID = 5091293162670592084L;
    private ArrayList<MahnungenDataObject> data = new ArrayList<MahnungenDataObject>();
    private ArrayList<RemindersTBL> tbls = new ArrayList<RemindersTBL>();
    private Main dataManager;
    private int selected = -1;
    public static final int MODE_TRANSFER_INTERVALL = 1;
    public static final int MODE_TRANSFER_VOID = 0;
    private int mode = MODE_TRANSFER_VOID;
    private String fromData, toData;

    public MahnungenTableModel(Main dataManager)
    {
	this.dataManager = dataManager;
	switch (mode)
	{
	case MODE_TRANSFER_INTERVALL:
	    this.transferDataByDate(fromData, toData);
	    return;
	case MODE_TRANSFER_VOID:
	    //this.transferFromDatabase();
	    return;
	}
    }

    public void archive()
    {
	if (selected == -1)
	{
	    JOptionPane.showMessageDialog(dataManager, "Sie m"
		    + UniCode.getue() + "ssen zuerst eine Zeile ausw"
		    + UniCode.getae() + "hlen");
	}

	dataManager.getMahnung().getA_ReminderInstance(tbls.get(selected));
	dataManager.getMahnung().set_Archivieren(true);
	dataManager.getMahnung().updateReminderItem();

	// this.transferToDatabase();
	switch (mode)
	{
	case MODE_TRANSFER_INTERVALL:
	    this.transferDataByDate(fromData, toData);
	    return;
	case MODE_TRANSFER_VOID:
	    this.transferFromDatabase();
	    return;
	}
    }

    public void delete()
    {
	if (selected == -1)
	    return;
	dataManager.getMahnung().deleteReminderItem(tbls.get(selected).getId());
	switch (mode)
	{
	case MODE_TRANSFER_INTERVALL:
	    this.transferDataByDate(fromData, toData);
	    return;
	case MODE_TRANSFER_VOID:
	    this.transferFromDatabase();
	    return;
	}
    }

    private String formatNumber(String nr)
    {
	int index = nr.indexOf(".");
	if (index == -1)
	    return nr + ".00";
	if (index == nr.length() - 2)
	{
	    return nr + "0";
	}
	return nr;
    }

    @Override
    public int getColumnCount()
    {
	return 11;
    }

    @Override
    public String getColumnName(int columnIndex)
    {
	switch (columnIndex)
	{
	case 0:
	    return "Name";
	case 1:
	    return "Matricule";
	case 2:
	    return "Offener Betrag";
	case 3:
	    return "Rechnungsdatum";
	case 4:
	    return "Zugestellt am";
	case 5:
	    return "Ausgeh" + UniCode.getae() + "ndigt am";
	case 6:
	    return "1. Mahnung";
	case 7:
	    return "2. Mahnung";
	case 8:
	    return "3. Mahnung";
	case 9:
	    return "Zum Friedensgericht am";
	case 10:
	    return "Bemerkung";
	}
	return "";
    }

    public ArrayList<MahnungenDataObject> getData()
    {
	return data;
    }

    @Override
    public int getRowCount()
    {
	return data.size();
    }

    public ArrayList<RemindersTBL> getTable()
    {
	return tbls;
    }

    @Override
    public Object getValueAt(int row, int column)
    {
	switch (column)
	{
	case 0:
	    return data.get(row).getName();
	case 1:
	    return data.get(row).getMatricule();
	case 2:
	    return formatNumber(data.get(row).getOffenerbetrag());
	case 3:
	    return data.get(row).getRechnungsdatum();
	case 4:
	    return data.get(row).getZustellungsdatum();
	case 5:
	    return data.get(row).getAusgehand();
	case 6:
	    return data.get(row).getErstemahnung();
	case 7:
	    return data.get(row).getZweitemahnung();
	case 8:
	    return data.get(row).getDrittemahnung();
	case 9:
	    return data.get(row).getFriedensgericht();
	case 10:
	    return data.get(row).getBemerkung();
	}
	return "";
    }

    @Override
    public boolean isCellEditable(int row, int col)
    {
	if (col >= 4)
	    return true;
	return false;
    }

    public void refresh()
    {
	switch (mode)
	{
	case MODE_TRANSFER_INTERVALL:
	    this.transferDataByDate(fromData, toData);
	    return;
	case MODE_TRANSFER_VOID:
	    this.transferFromDatabase();
	    return;
	}
    }

    public void showReminders()
    {
	this.transferFromDatabase();
    }
    
    public void setSelected(int c)
    {
	selected = c;
    }

    @Override
    public void setValueAt(Object aValue, int row, int column)
    {
	if (column >= 3)
	{
	    switch (column)
	    {
	    case 4:
		data.get(row).setZustellungsdatum((String) aValue);
		break;
	    case 5:
		data.get(row).setAusgehand((String) aValue);
		break;
	    case 6:
		data.get(row).setErstemahnung((String) aValue);
		break;
	    case 7:
		data.get(row).setZweitemahnung((String) aValue);
		break;
	    case 8:
		data.get(row).setDrittemahnung((String) aValue);
		break;
	    case 9:
		data.get(row).setFriedensgericht((String) aValue);
		break;
	    case 10:
		data.get(row).setBemerkung((String) aValue);
		break;
	    }
	    data.get(row).setChanged(true);
	    new Thread(new TransferToDatabaseDelegate(this)).start();
	    
	    //this.transferToDatabase();
	}
    }

    public void transferDataByDate(String fromDate, String toDate)
    {
	this.fromData = fromDate;
	this.toData = toDate;

	data.clear();
	tbls.clear();

	mode = LaborbuchDataModel.MODE_TRANSFER_INTERVALL;

	RemindersTBL[] tbl = dataManager.getMahnung()
		.listOLDRemindersOfINTERVAL(fromData, toData);

	if (tbl != null)
	    for (int i = 0; i < tbl.length; i++)
	    {
		MahnungenDataObject dr = new MahnungenDataObject();
		dr.setAusgehand(tbl[i].getAushangDatum());
		dr.setBemerkung(tbl[i].getBemerkung());
		dr.setDrittemahnung(tbl[i].getThirdReminder());
		dr.setErstemahnung(tbl[i].getFirstReminder());
		dr.setFriedensgericht(tbl[i].getAnFriedensGerichtAM());
		dr.setMatricule(tbl[i].getCustomer().getMatrikel_nummer());
		dr.setName(tbl[i].getCustomer().getNachname_1() + " "
			+ tbl[i].getCustomer().getNachname_2() + " "
			+ tbl[i].getCustomer().getNachname_3() + ", "
			+ tbl[i].getCustomer().getVorname());
		dataManager.getMahnung().getA_ReminderInstance(tbl[i]);
		dr.setOffenerbetrag("" + tbl[i].getRechnung().getAPayer());
		dr.setZustellungsdatum(tbl[i].getZustellungsDatum());
		dr.setZweitemahnung(tbl[i].getSecondReminder());
		dr.setId(tbl[i].getId());
		GregorianCalendar gc = (GregorianCalendar) tbl[i].getRechnung()
			.getErstell_datum();
		int d = gc.get(Calendar.DAY_OF_MONTH);
		String date = "";
		if (d < 10)
		    date = "0" + gc.get(Calendar.DAY_OF_MONTH);
		else
		    date = "" + gc.get(Calendar.DAY_OF_MONTH);
		d = (gc.get(Calendar.MONTH) + 1);
		if (d < 10)
		    date += ".0" + d;
		else
		    date += "." + d;
		date += "." + gc.get(Calendar.YEAR);
		dr.setRechnungsdatum(date);
		data.add(dr);
		tbls.add(tbl[i]);
	    }

	this.fireTableDataChanged();
    }

    public void transferFromDatabase()
    {
	data.clear();
	tbls.clear();

	mode = MahnungenTableModel.MODE_TRANSFER_VOID;

	RemindersTBL[] tbl = dataManager.getMahnung().listActualReminders();
	
	Thread process = new Thread(new DataProcessingDelegate(tbl, this.data, this.tbls));
	process.start();

	try
	{
	    // Wartet bis den Thread zu ende gegangen ist.
	    process.join();
	}
	catch (InterruptedException e)
	{
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}

	this.fireTableDataChanged();

	/*
	if (tbl != null)
	    for (int i = 0; i < tbl.length; i++)
	    {
		MahnungenDataObject dr = new MahnungenDataObject();
		dr.setAusgehand(tbl[i].getAushangDatum());
		dr.setBemerkung(tbl[i].getBemerkung());
		dr.setDrittemahnung(tbl[i].getThirdReminder());
		dr.setErstemahnung(tbl[i].getFirstReminder());
		dr.setFriedensgericht(tbl[i].getAnFriedensGerichtAM());
		dr.setMatricule(tbl[i].getCustomer().getMatrikel_nummer());
		dr.setName(tbl[i].getCustomer().getNachname_1() + " "
			+ tbl[i].getCustomer().getNachname_2() + " "
			+ tbl[i].getCustomer().getNachname_3() + ", "
			+ tbl[i].getCustomer().getVorname());
		dataManager.getMahnung().getA_ReminderInstance(tbl[i]);
		dr.setOffenerbetrag("" + tbl[i].getRechnung().getAPayer());
		dr.setZustellungsdatum(tbl[i].getZustellungsDatum());
		dr.setZweitemahnung(tbl[i].getSecondReminder());
		dr.setId(tbl[i].getId());
		GregorianCalendar gc = (GregorianCalendar) tbl[i].getRechnung()
			.getErstell_datum();
		int d = gc.get(Calendar.DAY_OF_MONTH);
		String date = "";
		if (d < 10)
		    date = "0" + gc.get(Calendar.DAY_OF_MONTH);
		else
		    date = "" + gc.get(Calendar.DAY_OF_MONTH);
		d = (gc.get(Calendar.MONTH) + 1);
		if (d < 10)
		    date += ".0" + d;
		else
		    date += "." + d;
		date += "." + gc.get(Calendar.YEAR);
		dr.setRechnungsdatum(date);
		data.add(dr);
		tbls.add(tbl[i]);
	    }

	this.fireTableDataChanged();
	*/
    }

    public void transferToDatabase()
    {
	RemindersTBL[] tbl = dataManager.getMahnung().listActualReminders();

	for (int i = 0; i < tbl.length; i++)
	{
	    // Sucht nach Übereinstimmung der ID
	    for (int j = 0; j < data.size(); j++)
	    {
		if (data.get(j).getId().equals(tbl[i].getId()))
		{
		    // Hat entsprechende ID gefunden
		    if (data.get(j).isChanged())
		    {
			/*dataManager.getMahnung().getA_ReminderInstance(tbl[i]);
			dataManager.getMahnung().set_AushangDatum(
				data.get(j).getAusgehand());
			dataManager.getMahnung().set_FirstReminder(
				data.get(j).getErstemahnung());
			dataManager.getMahnung().set_SecondReminder(
				data.get(j).getZweitemahnung());
			dataManager.getMahnung().set_ThirdReminder(
				data.get(j).getDrittemahnung());
			dataManager.getMahnung().set_AnFriedensGerichtAM(
				data.get(j).getFriedensgericht());
			dataManager.getMahnung().set_Bemerkung(
				data.get(j).getBemerkung());
			dataManager.getMahnung().updateReminderItem();
			data.get(j).setChanged(false);
			*/
			
			tbl[i].setAushangDatum(data.get(j).getAusgehand());
			tbl[i].setFirstReminder(data.get(j).getErstemahnung());
			tbl[i].setSecondReminder(data.get(j).getZweitemahnung());
			tbl[i].setThirdReminder(data.get(j).getDrittemahnung());
			tbl[i].setAnFriedensGerichtAM(data.get(j).getFriedensgericht());
			tbl[i].setBemerkung(data.get(j).getBemerkung());
			tbl[i].setZustellungsDatum(data.get(j).getZustellungsdatum());
			dataManager.getMahnung().updateReminderItem(tbl[i]);
			data.get(j).setChanged(false);
			System.out.println("BEMERKUNG::"+data.get(j).getZustellungsdatum());
			System.out.println("AUSHANG::"+data.get(j).getAusgehand());
			break;
		    }
		    else
		    {
			break;
		    }
		}
	    }
	}
    }
}